SPORE.$Import('core.core');

/*
---

name: Number

description: Contains Number Prototypes like limit, round, times, and ceil.

license: MIT-style license.

requires: Type

provides: Number

...
*/

SPORE.register('core.number',function($ns){

	Number.implement({
	
		limit: function(min, max){
			return Math.min(max, Math.max(min, this));
		},
	
		round: function(precision){
			precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
			return Math.round(this * precision) / precision;
		},
	
		times: function(fn, bind){
			for (var i = 0; i < this; i++) fn.call(bind, i, this);
		},
	
		toFloat: function(){
			return parseFloat(this);
		},
	
		toInt: function(base){
			return parseInt(this, base || 10);
		}
	
	});
	
	Number.alias('each', 'times');
	
	(function(math){
		var methods = {};
		math.each(function(name){
			if (!Number[name]) methods[name] = function(){
				return Math[name].apply(null, [this].concat(Array.from(arguments)));
			};
		});
		Number.implement(methods);
	})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);

});